﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate.Criterion;

namespace ProjectBaseData
{
    interface IDAO<T, IdT>
    {
        T GetByID(IdT id, bool shouldLock);
        List<T> GetAll();
        List<T> GetByCriteria(params ICriterion[] criterion);
        List<T> GetByExample(T exampleInstance, params string[] propertiesToExclude);
        T GetUniqueByExample(T exampleInstance, params string[] propertiesToExclude);
        T Save(T entity);
        T SaveOrUpdate(T entity);
        void Delete(T entity);
        void CommitChanges();
        void SaveValue(string tableName, string value);
        string SessionConfigPath { get; }

        /// <summary>
        /// Выполняет сохранение списка объектов в пакетном режиме с помощью транзакций.
        /// </summary>
        /// <param name="domains">Список объектов для сохранения.</param>
        /// <param name="maxCount">Количество объектов в одном пакете.</param>
        void SaveList(IList<T> domains, int maxCount = 100);

        /// <summary>
        /// Создает схему базы данных.
        /// </summary>
        void UpdateSchema();
    }
}
